.TH SG_VERIFY "8" "December 2019" "sg3_utils\-1.45" SG3_UTILS
.SH NAME
sg_verify \- invoke SCSI VERIFY command(s) on a block device
.SH SYNOPSIS
.B sg_verify
[\fI\-\-0\fR] [\fI\-\-16\fR] [\fI\-\-bpc=BPC\fR] [\fI\-\-count=COUNT\fR]
[\fI\-\-dpo\fR] [\fI\-\-ff\fR] [\fI\-\-ebytchk=BCH\fR] [\fI\-\-group=GN\fR]
[\fI\-\-help\fR] [\fI\-\-in=IF\fR] [\fI\-\-lba=LBA\fR] [\fI\-\-ndo=NDO\fR]
[\fI\-\-quiet\fR] [\fI\-\-readonly\fR] [\fI\-\-verbose\fR]
[\fI\-\-version\fR] [\fI\-\-vrprotect=VRP\fR] \fIDEVICE\fR
.SH DESCRIPTION
.\" Add any additional description here
Sends one or more SCSI VERIFY (10 or 16) commands to \fIDEVICE\fR. These SCSI
commands are defined in the SBC\-2 and SBC\-3 standards at https://www.t10.org
and SBC\-4 drafts.
.PP
When \fI\-\-ndo=NDO\fR is not given then the verify starts at the logical
block address given by the \fI\-\-lba=LBA\fR option and continues for
\fI\-\-count=COUNT\fR blocks. No more than \fI\-\-bpc=BPC\fR blocks are
verified by each VERIFY command so if necessary multiple VERIFY commands are
sent. Medium verification operations are performed by the \fIDEVICE\fR (e.g.
assuming each block has additional EEC data, check this against the logical
block contents). No news is good news (i.e. if there are no verify errors
detected then no messages are sent to stderr and the Unix exit status is 0).
.PP
When \fI\-\-ndo=NDO\fR is given then the \fI\-\-bpc=BPC\fR option is
ignored. A single VERIFY command is issued and a comparison starts at the
logical block address given by the \fI\-\-lba=LBA\fR option and continues for
\fI\-\-count=COUNT\fR blocks. The VERIFY command has an associated data\-out
buffer that is \fINDO\fR bytes long. The contents of the data\-out buffer are
obtained from the \fIFN\fR file (if \fI\-\-in=FN\fR is given) or from stdin.
A comparison takes place between data\-out buffer and the logical blocks
on the \fIDEVICE\fR. If the comparison is good then no messages are sent to
stderr and the Unix exit status is 0. If the comparison fails then a sense
buffer with a sense key of MISCOMPARE is returned; in this case the Unix exit
status will be 14. Messages will be sent to stderr associated with MISCOMPARE
sense buffer unless the \fI\-\-quiet\fR option is given.
.PP
In SBC\-3 revision 34 the BYTCHK field in all SCSI VERIFY commands was
expanded from one to two bits. That required some changes in the options
of this utility, see the section below on OPTION CHANGES.
.SH OPTIONS
Arguments to long options are mandatory for short options as well.
The options are arranged in alphabetical order based on the long
option name.
.TP
\fB\-0\fR, \fB\-\-0\fR
a buffer \fINDO\fR bytes long full of zeros is sent as the data\-out
part of a VERIFY command. So stdin is not read and if \fI\-\-in=IF\fR
is given, an error is generated. Useful when \fIBCH\fR is 3 to check
if some or all of \fIDEVICE\fR (e.g. a disk) is zero filled blocks.
.TP
\fB\-S\fR, \fB\-\-16\fR
uses a VERIFY(16) command (default VERIFY(10)). Even without this option,
using an \fI\-\-lba=LBA\fR which is too large, will cause the utility
to issue a VERIFY(16) command.
.TP
\fB\-b\fR, \fB\-\-bpc\fR=\fIBPC\fR
this option is ignored if \fI\-\-ndo=NDO\fR is given. Otherwise \fIBPC\fR
specifies the maximum number of blocks that will be verified by a single SCSI
VERIFY command. The default value is 128 blocks which equates to 64 KB for a
disk with 512 byte blocks. If \fIBPC\fR is less than \fICOUNT\fR then
multiple SCSI VERIFY commands are sent to the \fIDEVICE\fR. For the default
VERIFY(10) \fIBPC\fR cannot exceed 0xffff (65,535) while for VERIFY(16)
\fIBPC\fR cannot exceed 0x7fffffff (2,147,483,647). For recent block
devices (disks) this value may be constrained by the maximum transfer length
field in the block limits VPD page.
.TP
\fB\-c\fR, \fB\-\-count\fR=\fICOUNT\fR
where \fICOUNT\fR specifies the number of blocks to verify. The default value
is 1 . If \fICOUNT\fR is greater than \fIBPC\fR (or its default value of 128)
and \fINDO\fR is not given, 0 or less than multiple SCSI VERIFY commands are
sent to the device. Otherwise \fICOUNT\fR becomes the contents of the
verification length field of the SCSI VERIFY command issued. The
.B sg_readcap
utility can be used to find the maximum number of blocks that a block
device (e.g. a disk) has.
.TP
\fB\-d\fR, \fB\-\-dpo\fR
disable page out changes the cache retention priority of blocks read on
the device's cache to the lowest priority. This means that blocks read by
other commands are more likely to remain in the device's cache.
.TP
\fB\-E\fR, \fB\-\-ebytchk\fR=\fIBCH\fR
sets the BYTCHK field to \fIBCH\fR overriding the value (1) set by the
\fI\-\-ndo=NDO\fR option. Values of 1, 2 or 3 are accepted for \fIBCH\fR
however sbc3r34 reserves the value 2. If this option is given then
\fI\-\-ndo=NDO\fR must also be given. If \fIBCH\fR is 3 then \fINDO\fR
should be the size of one logical block (plus the size of some or all
of the protection information if \fIVRP\fR is greater
than 0).
.TP
\fB\-f\fR, \fB\-\-ff\fR
a buffer \fINDO\fR bytes long full of 0xff bytes is sent as the data\-out
part of a VERIFY command. So stdin is not read and if \fI\-\-in=IF\fR
is given, an error is generated. Useful when \fIBCH\fR is 3 to check
if some or all of \fIDEVICE\fR (e.g. a disk) is 0xff byte filled blocks.
.TP
\fB\-g\fR, \fB\-\-group\fR=\fIGN\fR
where \fIGN\fR becomes the contents of the group number field in the SCSI
VERIFY(16) command. It can be from 0 to 63 inclusive. The default value for
\fIGN\fR is 0. Note that this option is ignored for the SCSI VERIFY(10)
command.
.TP
\fB\-h\fR, \fB\-\-help\fR
output the usage message then exit.
.TP
\fB\-i\fR, \fB\-\-in\fR=\fIIF\fR
where \fIIF\fR is the name of a file from which \fINDO\fR bytes will be read
and placed in the data\-out buffer. This is only done when the
\fI\-\-ndo=NDO\fR option is given. If this option is not given then stdin
is read. If \fIIF\fR is "\-" then stdin is also used.
.TP
\fB\-l\fR, \fB\-\-lba\fR=\fILBA\fR
where \fILBA\fR specifies the logical block address of the first block to
start the verify operation. \fILBA\fR is assumed to be decimal unless prefixed
by '0x' or a trailing 'h' (see below). The default value is 0 (i.e. the start
of the device).
.TP
\fB\-n\fR, \fB\-\-ndo\fR=\fINDO\fR
\fINDO\fR is the number of bytes to obtain from the \fIFN\fR file (if
\fI\-\-in=FN\fR is given) or from stdin. Those bytes are placed in the
data\-out buffer associated with the SCSI VERIFY command and \fINDO\fR
is placed in the verification length field in the cdb. The default value
for \fINDO\fR is 0 and the maximum value is dependent on the OS. If the
\fI\-\-ebytchk=BCH\fR option is not given then the BYTCHK field in the cdb
is set to 1.
.TP
\fB\-q\fR, \fB\-\-quiet\fR
suppress the sense buffer messages associated with a MISCOMPARE sense key
that would otherwise be sent to stderr. Still set the exit status to 14
which is the sense key value indicating a MISCOMPARE .
.TP
\fB\-r\fR, \fB\-\-readonly\fR
opens the DEVICE read\-only rather than read\-write which is the
default. The Linux sg driver needs read\-write access for the SCSI
VERIFY command but other access methods may require read\-only access.
.TP
\fB\-v\fR, \fB\-\-verbose\fR
increase the level of verbosity, (i.e. debug output).
.TP
\fB\-V\fR, \fB\-\-version\fR
print the version string and then exit.
.TP
\fB\-P\fR, \fB\-\-vrprotect\fR=\fIVRP\fR
where \fIVRP\fR is the value in the vrprotect field in the VERIFY command
cdb. It must be a value between 0 and 7 inclusive. The default value is
zero.
.SH BYTCHK
BYTCHK is the name of a field (two bits wide) in the VERIFY(10) and
VERIFY(16) commands. When set to 1 or 3 (sbc3r34 reserves the value 2) it
indicates that associated with the SCSI VERIFY command, a data\-out buffer
will be sent for the device (disk) to check. Using the \fI\-\-ndo=NDO\fR
option sets the BYTCHK field to 1 and \fINDO\fR is the number of bytes
placed in the data\-out buffer. Those bytes are obtained from stdin or
\fIIF\fR (from the \fI\-\-in=FN\fR option). The \fI\-\-ebytchk=BCH\fR
option may be used to override the BYTCHK field value of 1 with \fIBCH\fR.
.PP
The calculation of \fINDO\fR is left up to the user. Its value depends
on the logical block size (which can be found with the sg_readcap utility),
the \fICOUNT\fR and the \fIVRP\fR values. If the \fIVRP\fR is greater than
0 then each logical block will contain an extra 8 bytes (at least) of
protection information.
.PP
When the BYTCHK field is 0 then the verification process done by the
device (disk) is vendor specific. It typically involves checking each
block on the disk against its error correction codes (ECC) which is
additional data also held on the disk.
.PP
Many Operating Systems put limits on the maximum size of the
data\-out (and data\-in) buffer. For Linux at one time the limit was
less than 1 MB but has been increased somewhat.
.SH OPTION CHANGES
Earlier versions of this utility had a \fI\-\-bytchk=NDO\fR option which
set the BYTCHK bit and set the cdb verification length field to \fINDO\fR.
The shorter form of that option was \fI\-B NDO\fR. For backward
compatibility that option is still present but not documented. In its place
is the \fI\-\-ndo=NDO\fR whose shorter form of \fI\-n NDO\fR.
\fI\-\-ndo=NDO\fR sets the BYTCHK field to 1 unless that is overridden by
the \fI\-\-ebytchk=BCH\fR.
.SH NOTES
Various numeric arguments (e.g. \fILBA\fR) may include multiplicative
suffixes or be given in hexadecimal. See the "NUMERIC ARGUMENTS" section
in the sg3_utils(8) man page.
.PP
The amount of error correction and the number of retries attempted before a
block is considered defective are controlled in part by the Verify Error
Recovery mode page. A note in the SBC\-3 draft (rev 29 section 6.4.9 on the
Verify Error Recovery mode page) advises that to minimize the number of
checks (and hence have the most "sensitive" verify check) do the following
in that mode page: set the EER bit to 0, the PER bit to 1, the DTE bit to 1,
the DCR bit to 1, the verify retry count to 0 and the verify recovery time
limit to 0. Mode pages can be modified with the
.B sdparm
utility.
.PP
The SCSI VERIFY(6) command defined in the SSC\-2 standard and later (i.e.
for tape drive systems) is not supported by this utility.
.SH EXIT STATUS
The exit status of sg_verify is 0 when it is successful. When \fIBCH\fR is
other than 0 then a comparison takes place and if it fails then the exit
status is 14 which happens to be the sense key value of MISCOMPARE.
Otherwise see the EXIT STATUS section in the sg3_utils(8) man page.
.PP
Earlier versions of this utility set an exit status of 98 when there was a
MISCOMPARE.
.SH AUTHORS
Written by Douglas Gilbert.
.SH "REPORTING BUGS"
Report bugs to <dgilbert at interlog dot com>.
.SH COPYRIGHT
Copyright \(co 2004\-2019 Douglas Gilbert
.br
This software is distributed under a BSD\-2\-Clause license. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
.SH "SEE ALSO"
.B sdparm(sdparm), sg_modes(sg3_utils), sg_readcap(sg3_utils),
.B sg_inq(sg3_utils)
